/**
 * Created by zengxm on 12/21/2016.
 */
const fs=require("fs")
const path=require("path")
const colors=require('colors')

const U=require('../Utils')
const host=require("../host")
const E=require("../exceptions")

const DIR = "./service"

//----------------------Exports-------------------------
exports.description = "服务调用. 键入 -h 来查看更多帮助信息"

function _list() {
    var files=[];
    var fileNames=fs.readdirSync(DIR);
    fileNames.forEach(fn=>{
        if(!fs.statSync(path.join(DIR, fn)).isFile())
            files.push(fn);
    })
    return files
}

/**
 * 帮助信息
 */
exports.help=(cmd)=>{
    console.log(cmd,"help")
}

exports.command=(command,datas,options)=>{
    const cmd = command || "list";
    //列出全部可用的service
    if(cmd==='list'){
        const list=_list()
        //如果需要列出详细信息
        if(options.information){
            const headers=['name','author','version', 'description']
            const rows=[];
            list.forEach(l=>{
                //判断package.json文件是否存在
                const packagePath = path.join(DIR,l,'package.json')
                if(fs.existsSync(packagePath)){
                    //读取文件夹下的package.json文件
                    const p=U.readToJSON(packagePath)
                    rows.push([p.name || l, p.author||'', p.version||'-',p.description||''])
                }
                //如果不存在
                else
                    rows.push([l,'-','-'])
            })
            console.table(headers, rows)
        }else{
            list.forEach(l=>console.log(("  "+l).yellow))
        }

        console.log(("total "+list.length+" services:").magenta)
    }

    else {
        /*
         动态加载service模块

         流程：
         1.先判断index.js是否存在，如果存在，则调用index.js
         2.若不存在，则判断index.json是否存在，若存在，则使用通用的解析器去执行
         3.若不存在，则提示无法加载模块
         */

        if(datas.length==0 && !options.all)
            throw E.NO_HOST_SELECTED
        const hosts=host.get(datas)
        try{
            const service = require("../../service/"+cmd)
            service.run(hosts, options);
        }catch (e){
            //判断index.json是否存在
            const indexJson=path.join(DIR,cmd,'index.json')
            if(fs.existsSync(indexJson)){
                const autoJson = U.readToJSON(indexJson)
                console.log(JSON.stringify(autoJson))

                const runner = require("../..service/runner")
                runner.run(cmd,hosts,options)
            }
            else
                console.error(("service call failed : "+e.message).red)
        }
    }
}